package com.microframework.base.core.datasource.example;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.microframework.base.core.datasource.annotation.Tx;

import lombok.extern.slf4j.Slf4j;

/**
 * JFinal事务使用示例
 * 演示如何使用@Tx注解进行事务控制
 */
@Slf4j
//@Service
public class TxExample {

    /**
     * 基本事务示例 - 使用默认数据源
     */
    @Tx
    public void createUser(String username, String password, String email) {
        // 创建用户记录
//        User user = new User();
//        user.setUsername(username);
//        user.setPassword(password);
//        user.setEmail(email);
//        user.setCreatedAt(new java.util.Date());
//        user.save();
        
        log.info("用户创建成功: {}", username);
    }
    
    /**
     * 带数据源指定的事务示例
     */
    @Tx("business")
    public void createOrder(String userId, String productId, int quantity) {
        // 创建订单记录
        Record order = new Record();
        order.set("user_id", userId);
        order.set("product_id", productId);
        order.set("quantity", quantity);
        order.set("status", "CREATED");
        order.set("created_at", new java.util.Date());
        Db.save("t_order", order);
        
        // 减少库存
        Db.update("UPDATE t_inventory SET stock = stock - ? WHERE product_id = ?", 
                quantity, productId);
        
        log.info("订单创建成功: 用户={}, 商品={}, 数量={}", userId, productId, quantity);
    }
    
    /**
     * 超时控制事务示例
     */
    @Tx(timeout = 5)
    public void longRunningTransaction() {
        // 第一步操作
        Db.update("UPDATE t_system_config SET value = ? WHERE name = ?", 
                "processing", "batch_job_status");
        
        try {
            // 模拟长时间处理
            Thread.sleep(3000);
            
            // 更多数据库操作...
            Db.update("UPDATE t_system_config SET value = ? WHERE name = ?", 
                    "completed", "batch_job_status");
            
            log.info("长时间事务执行完成");
        } catch (InterruptedException e) {
            // 处理中断异常
            log.error("事务执行被中断", e);
            throw new RuntimeException("事务执行被中断", e);
        }
    }
    
    /**
     * 事务回滚示例
     */
    @Tx
    public void transactionWithRollback(String userId, String productId, int quantity) {
        try {
            // 创建订单
            Record order = new Record();
            order.set("user_id", userId);
            order.set("product_id", productId);
            order.set("quantity", quantity);
            order.set("status", "CREATED");
            order.set("created_at", new java.util.Date());
            Db.save("t_order", order);
            
            // 减少库存（可能失败）
            int affected = Db.update("UPDATE t_inventory SET stock = stock - ? WHERE product_id = ? AND stock >= ?", 
                    quantity, productId, quantity);
            
            if (affected == 0) {
                // 库存不足，抛出异常触发回滚
                throw new RuntimeException("库存不足，无法下单");
            }
            
            log.info("订单创建成功: 用户={}, 商品={}, 数量={}", userId, productId, quantity);
        } catch (Exception e) {
            // 异常会触发事务回滚
            log.error("订单创建失败: {}", e.getMessage());
            throw e; // 重新抛出异常，确保事务回滚
        }
    }
} 